Skip to main content

Variables

2.1 Variable turlari

Nazariya

Bash da barcha o'zgaruvchilar aslida string sifatida saqlanadi, lekin kontekstga qarab raqam sifatida ishlatilishi mumkin. O'zgaruvchi nomlari faqat harflar, raqamlar va pastki chiziq (_) dan iborat bo'lishi kerak va raqam bilan boshlanmasligi kerak.

O'zgaruvchi turlari:

  • Local variables - faqat joriy shell da mavjud
  • Environment variables - barcha subprocess larga uzatiladi
  • Shell variables - shell tomonidan maxsus ishlatiladi
  • Array variables - bir nechta qiymatni saqlaydi
  • Read-only variables - o'zgartirib bo'lmaydigan

Amaliyot

#!/bin/bash

# =====================================
# LOCAL VARIABLES
# =====================================

# String o'zgaruvchilar
FIRST_NAME="Ahmad"
LAST_NAME="Karimov"
FULL_NAME="$FIRST_NAME $LAST_NAME"

# Raqamli o'zgaruvchilar (aslida string)
AGE=25
YEAR=2024
SALARY=5000000

# Boolean o'zgaruvchilar (string sifatida)
IS_STUDENT=true
IS_MARRIED=false

echo "Ism: $FULL_NAME"
echo "Yosh: $AGE"
echo "Talabami: $IS_STUDENT"

# =====================================
# ENVIRONMENT VARIABLES
# =====================================

# Environment o'zgaruvchi yaratish
export DATABASE_URL="postgresql://localhost:5432/mydb"
export API_KEY="abc123xyz789"
export DEBUG_MODE="true"

# Child process da ham mavjud bo'ladi
bash -c 'echo "Child da API_KEY: $API_KEY"'

# =====================================
# ARRAY VARIABLES
# =====================================

# Oddiy array
COLORS=("qizil" "ko'k" "yashil" "sariq")
NUMBERS=(1 2 3 4 5 10 20)

# Array elementlariga kirish
echo "Birinchi rang: ${COLORS[0]}"
echo "Barcha ranglar: ${COLORS[@]}"
echo "Ranglar soni: ${#COLORS[@]}"

# =====================================
# READ-ONLY VARIABLES
# =====================================

# O'zgarmas qiymatlar
readonly PI=3.14159
readonly COMPANY_NAME="MyCompany"
readonly MAX_USERS=100

echo "PI qiymati: $PI"
# PI=3.14 # Bu xato beradi!

# =====================================
# SPECIAL VARIABLES
# =====================================

echo "Script nomi: $0"
echo "Birinchi argument: $1"
echo "Argumentlar soni: $#"
echo "Barcha argumentlar: $@"
echo "Script PID: $$"
echo "Oxirgi buyruq exit kodi: $?"

Real loyiha misoli:

#!/bin/bash
# Web application konfiguratsiyasi

# =====================================
# APPLICATION SETTINGS
# =====================================

# Read-only application constants
readonly APP_NAME="MyWebApp"
readonly APP_VERSION="2.1.0"
readonly CONFIG_DIR="/etc/myapp"

# Environment-specific variables
export ENVIRONMENT="production" # development, staging, production
export LOG_LEVEL="INFO" # DEBUG, INFO, WARN, ERROR

# Database configuration
export DB_HOST="localhost"
export DB_PORT="5432"
export DB_NAME="myapp_db"
export DB_USER="app_user"
# Parolni file dan o'qish (xavfsizlik uchun)
if [[ -f "/etc/myapp/db_password" ]]; then
export DB_PASSWORD=$(cat /etc/myapp/db_password)
fi

# Server configuration
SERVER_HOST="0.0.0.0"
SERVER_PORT=8080
MAX_CONNECTIONS=1000

# Feature flags
ENABLE_CACHE=true
ENABLE_LOGGING=true
ENABLE_METRICS=false

echo "🚀 $APP_NAME v$APP_VERSION ishga tushmoqda..."
echo "📊 Environment: $ENVIRONMENT"
echo "🗄️ Database: $DB_HOST:$DB_PORT/$DB_NAME"
echo "🌐 Server: $SERVER_HOST:$SERVER_PORT"

2.2 Variable operations

Nazariya

O'zgaruvchilar bilan turli operatsiyalar bajarish mumkin: yaratish, o'qish, o'zgartirish, birlashtirish va qiymat tekshirish.

Asosiy operatsiyalar:

  • Assignment: VAR=value
  • Reading: $VAR yoki ${VAR}
  • Default values: ${VAR:-default}
  • String manipulation: uzunlik, kesish, almashtirish

Amaliyot

#!/bin/bash

# =====================================
# VARIABLE ASSIGNMENT
# =====================================

# To'g'ri usullar
NAME="Ahmad Karimov" # Oddiy tayinlash
AGE=25 # Raqam (string sifatida)
CITY="Toshkent" # Shahar nomi

# Command output ni o'zgaruvchiga saqlash
CURRENT_DATE=$(date +%Y-%m-%d)
USER_COUNT=$(who | wc -l)
HOME_SIZE=$(du -sh $HOME | cut -f1)

echo "Bugun: $CURRENT_DATE"
echo "Foydalanuvchilar: $USER_COUNT"
echo "Home katalog hajmi: $HOME_SIZE"

# =====================================
# VARIABLE READING
# =====================================

USERNAME="john_doe"

# Oddiy o'qish
echo $USERNAME

# Xavfsiz o'qish (tavsiya etiladi)
echo "$USERNAME"

# Aniq o'qish (brace notation)
echo "${USERNAME}"

# O'zgaruvchi nomini boshqa belgilar bilan birlashtirish
echo "${USERNAME}_backup" # john_doe_backup
echo "$USERNAMEbackup" # bo'sh (noto'g'ri)

# =====================================
# DEFAULT VALUES
# =====================================

# Agar o'zgaruvchi bo'sh yoki mavjud bo'lmasa, default qiymat ishlatish
DATABASE_HOST=${DATABASE_HOST:-"localhost"}
SERVER_PORT=${SERVER_PORT:-8080}
LOG_LEVEL=${LOG_LEVEL:-"INFO"}

echo "Database server: $DATABASE_HOST"
echo "Server port: $SERVER_PORT"
echo "Log level: $LOG_LEVEL"

# Alternative value - agar o'zgaruvchi mavjud bo'lsa, boshqa qiymat ishlatish
DEBUG_MODE="true"
LOG_FILE=${DEBUG_MODE:+"debug.log"}
echo "Log file: ${LOG_FILE:-"production.log"}"

# Error agar o'zgaruvchi bo'sh bo'lsa
REQUIRED_API_KEY=${API_KEY:?"API_KEY environment variable kerak!"}

# =====================================
# STRING MANIPULATION
# =====================================

TEXT="Hello World from Uzbekistan"

# String uzunligi
echo "Matn uzunligi: ${#TEXT}"

# Substring (kesish)
echo "Birinchi 5 belgi: ${TEXT:0:5}" # Hello
echo "6-belgidan boshlab: ${TEXT:6}" # World from Uzbekistan
echo "Oxirgi 10 belgi: ${TEXT: -10}" # Uzbekistan

# Case conversion (Bash 4.0+)
UPPER_TEXT="${TEXT^^}" # HELLO WORLD FROM UZBEKISTAN
LOWER_TEXT="${TEXT,,}" # hello world from uzbekistan
TITLE_TEXT="${TEXT^}" # Hello world from uzbekistan

echo "Katta harf: $UPPER_TEXT"
echo "Kichik harf: $LOWER_TEXT"
echo "Title case: $TITLE_TEXT"

# =====================================
# PATTERN REPLACEMENT
# =====================================

FILENAME="document.txt.backup"

# Birinchi match ni almashtirish
NEW_NAME="${FILENAME/txt/pdf}" # document.pdf.backup

# Barcha match larni almashtirish
ALL_REPLACED="${FILENAME//./}" # documenttxtbackup

# Prefix/suffix o'chirish
NO_EXTENSION="${FILENAME%.*}" # document.txt
JUST_NAME="${FILENAME%%.*}" # document
NO_PATH="${FILENAME##*/}" # document.txt.backup

echo "Asl fayl: $FILENAME"
echo "Extension o'zgartirilgan: $NEW_NAME"
echo "Nuqtalar o'chirilgan: $ALL_REPLACED"
echo "Extension o'chirilgan: $NO_EXTENSION"
echo "Faqat nom: $JUST_NAME"

Real-world variable management misoli:

#!/bin/bash
# Configuration manager script

# =====================================
# CONFIGURATION VARIABLES
# =====================================

# Default konfiguratsiya
CONFIG_FILE="${CONFIG_FILE:-/etc/myapp/config.conf}"
LOG_DIR="${LOG_DIR:-/var/log/myapp}"
DATA_DIR="${DATA_DIR:-/var/lib/myapp}"
TMP_DIR="${TMP_DIR:-/tmp/myapp}"

# =====================================
# VALIDATION FUNCTIONS
# =====================================

validate_config() {
local errors=0

# Required variables tekshirish
if [[ -z "${DATABASE_URL:-}" ]]; then
echo "❌ ERROR: DATABASE_URL majburiy o'zgaruvchi"
((errors++))
fi

if [[ -z "${API_SECRET:-}" ]]; then
echo "❌ ERROR: API_SECRET majburiy o'zgaruvchi"
((errors++))
fi

# Kataloglar mavjudligini tekshirish
for dir in "$LOG_DIR" "$DATA_DIR" "$TMP_DIR"; do
if [[ ! -d "$dir" ]]; then
echo "⚠️ WARNING: Katalog mavjud emas: $dir"
mkdir -p "$dir" && echo "✅ Katalog yaratildi: $dir"
fi
done

return $errors
}

# =====================================
# ENVIRONMENT SETUP
# =====================================

setup_environment() {
echo "🔧 Environment sozlanmoqda..."

# Default qiymatlar o'rnatish
export NODE_ENV="${NODE_ENV:-production}"
export PORT="${PORT:-3000}"
export WORKERS="${WORKERS:-$(nproc)}"

# Feature flags
export ENABLE_METRICS="${ENABLE_METRICS:-true}"
export ENABLE_CACHE="${ENABLE_CACHE:-true}"
export ENABLE_DEBUG="${ENABLE_DEBUG:-false}"

# Security settings
export SESSION_SECRET="${SESSION_SECRET:-$(openssl rand -hex 32)}"
export JWT_EXPIRES_IN="${JWT_EXPIRES_IN:-1d}"

echo "✅ Environment tayyor"
}

# =====================================
# CONFIGURATION DISPLAY
# =====================================

show_config() {
echo "📋 Joriy konfiguratsiya:"
echo " CONFIG_FILE: $CONFIG_FILE"
echo " LOG_DIR: $LOG_DIR"
echo " DATA_DIR: $DATA_DIR"
echo " NODE_ENV: ${NODE_ENV:-unset}"
echo " PORT: ${PORT:-unset}"
echo " WORKERS: ${WORKERS:-unset}"
echo

echo "🔒 Security:"
echo " SESSION_SECRET: ${SESSION_SECRET:0:8}... (hidden)"
echo " JWT_EXPIRES_IN: ${JWT_EXPIRES_IN:-unset}"
echo

echo "🚀 Features:"
echo " METRICS: ${ENABLE_METRICS:-false}"
echo " CACHE: ${ENABLE_CACHE:-false}"
echo " DEBUG: ${ENABLE_DEBUG:-false}"
}

# =====================================
# MAIN SCRIPT
# =====================================

main() {
echo "🔧 Application konfiguratsiya boshqaruvchisi"
echo "================================================"

setup_environment

if validate_config; then
echo "✅ Konfiguratsiya to'g'ri"
show_config
else
echo "❌ Konfiguratsiya xatolari topildi"
exit 1
fi
}

# Script ishga tushirish
main "$@"

Variable debugging va troubleshooting:

#!/bin/bash

# =====================================
# DEBUGGING VARIABLES
# =====================================

debug_variables() {
echo "🐛 Variable debugging"
echo "===================="

# Barcha o'zgaruvchilarni ko'rsatish
echo "📊 Environment variables:"
env | grep -E "^(PATH|HOME|USER|SHELL)" | sort
echo

# Local variables
echo "📝 Local variables:"
set | grep -E "^[A-Z_].*=" | head -10
echo

# Specific variable haqida ma'lumot
local var_name="PATH"
echo "🔍 $var_name haqida:"
echo " Qiymat: ${!var_name}"
echo " Uzunlik: ${#PATH}"
echo " Type: $(declare -p PATH 2>/dev/null | cut -d' ' -f2)"
}

# Variable export status tekshirish
check_export_status() {
local var_name="$1"

if declare -p "$var_name" 2>/dev/null | grep -q "declare -x"; then
echo "✅ $var_name exported (global)"
else
echo "📍 $var_name local variable"
fi
}

# Variable type aniqlash
get_variable_type() {
local var_name="$1"
local declaration

declaration=$(declare -p "$var_name" 2>/dev/null)

case "$declaration" in
*"declare -a"*) echo "Array" ;;
*"declare -A"*) echo "Associative Array" ;;
*"declare -i"*) echo "Integer" ;;
*"declare -r"*) echo "Read-only" ;;
*"declare -x"*) echo "Exported" ;;
*"declare --"*) echo "String" ;;
*) echo "Unknown/Unset" ;;
esac
}

# Test
debug_variables
check_export_status "PATH"
check_export_status "HOME"
echo "PATH type: $(get_variable_type "PATH")"

Bu 2-bob bo'yicha to'liq qo'llanma. 3-bob (Input/Output) uchun ham yozamanmi?